function curry(fn, ...args) {
    // 函数的 length 是函数的参数个数
    if (args.length === fn.length) {
        return fn(...args)
    }

    return function _curry(...params) { // ...取多个参数，不加...只能取第一个参数，有区别
        args.push(...params) // key关键收集参数
        // args是push之后的参数个数
        if (args.length === fn.length) {
            return fn(...args) // fn参数作为闭包变量，一直存在，hoc高阶函数的参数都作为闭包变量
        } // 2个return返回的是fn执行结果，还是另一个函数
        return _curry // else 不相等，继续返回函数，返回函数就是闭包，
    }
}

function add(a, b, c) {
    return a + b + c
}

console.log(curry(add, 1, 2, 3)) // 6
console.log(curry(add, 1)(2)(3)) // 6
console.log(curry(add)(1)(2)(3)) // 6